home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / Pfs.man,v < prev    next >
Text File  |  1990-06-27  |  21KB  |  525 lines

  1. head     1.1;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @@;
  7.  
  8.  
  9. 1.1
  10. date     89.04.06.08.24.45;  author brent;  state Exp;
  11. branches ;
  12. next     ;
  13.  
  14.  
  15. desc
  16. @Pseudo-file-system library package
  17. @
  18.  
  19.  
  20.  
  21. 1.1
  22. log
  23. @Initial revision
  24. @
  25. text
  26. @' $Header: /sprite/src/lib/c/etc/RCS/Pdev_Open.man,v 1.1 88/12/30 14:34:45 ouster Exp Locker: brent $ SPRITE (Berkeley)
  27. .so \*(]ltmac.sprite
  28. .HS Pfs lib
  29. .BS
  30. .SH NAME
  31. Pfs_Open, Pfs_OpenConnection, Pfs_SetHandler, Pfs_PassFile, Pfs_Close \- Package for servicing pseudo-file-systems.
  32. .SH SYNOPSIS
  33. \fB#include <pdev.h>\fR
  34. .sp
  35. Pfs_Token
  36. .br
  37. \fBPfs_Open\fR(\fIprefix, rootIDPtr, pfsService, clientData\fR)
  38. .br
  39. Pdev_Stream *
  40. .br
  41. \fBPfs_OpenConnection\fR(\fIpfsToken, fileIDPtr, reqBufSize, readBufSize, readBuf, selectBits, pdevService\fR)
  42. .br
  43. int (*
  44. .br
  45. \fBPfs_SetHandler\fR(\fIpfsToken, operation, handler\fP))()
  46. .br
  47. int
  48. .br
  49. \fBPfs_PassFile\fR(\fIpfsToken, streamID\fP)
  50. .br
  51. void
  52. .br
  53. \fBPfs_Close\fR(\fIpfsToken\fP)
  54. .SH ARGUMENTS
  55. .AS Pfs_CallBacks pdevService
  56. .AP char *prefix in
  57. File name prefix of the pseudo-file-system.
  58. .AP Fs_FileID *rootIDPtr in
  59. The server-defined ID of the root.
  60. .AP Pfs_CallBacks *pfsService in
  61. Set of name service call-back procedures.
  62. .AP ClientData clientData in
  63. User-defined data passed to service call-backs.
  64. .AP Pfs_Token pfsToken in
  65. Return value of \fBPfs_Open\fP.
  66. .AP Fs_FileID *fileIDPtr in
  67. Server's identifier for file in pseudo-file-system.
  68. .AP int reqBufSize in
  69. Preferred size for the request buffer.
  70. .AP int readBufSize in
  71. Size of read buffer.  Zero means no read buffering.
  72. .AP char *readBuf in
  73. Optional read buffer, or NULL.
  74. .AP int selectBits in
  75. \fBFS_READABLE\fR, \fBFS_WRITABLE\fR, \fBFS_EXCEPTION\fR
  76. .AP Pdev_CallBacks *pdevService in
  77. Set of pseudo-device service call-back procedures.
  78. .AP int streamID in
  79. A regular open file descriptor returned from \fBopen\fP.
  80. .BE
  81. .SH Pfs_Open
  82. .ta 1.0i 3.0i 3.5i
  83. .LP
  84. \fBPfs_Open\fR declares a server process for a pseudo-file-system
  85. and installs a set of service procedures for it.
  86. The service procedures are called when client processes
  87. do file naming operations on the pseudo-file-system,
  88. i.e. \fBopen\fR, \fBstat\fR, \fBunlink\fR, \fBmkdir\fR, \fBrmdir\fR, \fBrename\fR, and \fBlink\fR.
  89. As a side effect of opening a file in the pseudo-file-system the
  90. server can set up a pseudo-device connection for the open file.
  91. Thus the server can completely implement file system
  92. access to the pseudo-file-system.
  93. .PP
  94. The \fIprefix\fP argument indicates what part of the global file system
  95. hierarchy is controlled by the pseudo-file-system server.
  96. This prefix can be arbitrarily nested in the hierarchy
  97. but there must be a remote link that corresponds to it.
  98. (The command \fBln -r \fIprefix\fR creates a remote link for the prefix.)
  99. The existence of the remote link ensures that the kernel's lookup
  100. algorithm will automatically find the pseudo-file-system server.
  101. The pseudo-file-system is visible across the network as well.
  102. .PP
  103. The \fIrootIDPtr\fP defines the file ID for the root of the pseudo-file-system.
  104. This ID will be presented as the \fBprefixID\fP for pathnames that begin
  105. at the root (prefix) of the pseudo-file-system.  The file ID has the following
  106. format.  The server can define the file ID to fit its own needs.
  107. However, the special type value of -1 is reserved to indicate an
  108. invalid file ID.
  109. .DS
  110. typedef struct {
  111.     int type;
  112.     int serverID;
  113.     int major;
  114.     int minor;
  115. } Fs_FileID;
  116. .DE
  117. .LP
  118. The \fIpfsService\fP procedures are described in detail below.
  119. The \fIclientData\fP argument is passed to all the naming service
  120. procedures.  It is ordinarily used to get
  121. to the state of the pseudo-file-system.
  122. .LP
  123. The return value of \fBPfs_Open\fR is a token for the pseudo-file-system,
  124. which must be used in calls to \fBPfs_OpenConnection\fR,
  125. \fBPfs_PassFile\fP,
  126. \fBPfs_SetHandler\fR, and \fBPfs_Close\fP.
  127. If a pseudo-file-system couldn't be opened, then NULL is
  128. returned and \fBpfs_ErrorMsg\fR contains a string
  129. describing the problem.
  130. .LP
  131. The Pfs package uses the facilities of \fBFs_Dispatch\fR in order to keep
  132. track of the streams associated with the pseudo-file-system and ensure
  133. that Pfs is notified whenever those streams become readable.  In order
  134. to use Pfs, you must also use \fBFs_Dispatch\fR.
  135. .SH Pfs_OpenConnection
  136. .PP
  137. \fBPfs_OpenConnection\fP is used to create open file connections
  138. to the pseudo-file-system indicated by \fIpfsToken\fP.
  139. Open file connections can only be made during an \fBopen\fP call-back.
  140. The open file connection is the same as a connection to a pseudo-device
  141. with the addition of two new requests to handle
  142. \fBfstat\fR, \fBfchmod\fR, and \fBfchown\fR.
  143. The details of using the pseudo-device call-backs are given
  144. in the \fBPdev\fP man page.
  145. .PP
  146. The \fIfileIDPtr\fP is a server-defined identifier for the open file.
  147. The server can set the file ID fields to any values that make sense to it.
  148. However, by convention a type of -1 indicates an invalid fileID.
  149. This special case may occur when handling the \fBrename\fP and
  150. \fBhardLink\fP call-backs.
  151. Note that the file IDs for directories in the pseudo-file-system
  152. may be presented back to the server as a \fBprefixID\fP
  153. that indicates the starting point of the lookup operation.
  154. Thus a process can have a current directory inside the pseudo-file-system
  155. and name files relative to that directory.
  156. .PP
  157. The \fIpdevService\fP parameter is a set of pseudo-device call-backs.
  158. The use of these call-backs is described in detail in the \fBPdev\fP man page.
  159. .PP
  160. The \fIreqBufSize\fP parameter indicates the preferred size of the
  161. request buffer associated with the pseudo-device connection.  This size
  162. determines how many requests can be bufferred before the kernel has to
  163. wait on the server.  A minimum size is enforced by the library, so
  164. zero can be passed to get the default size (about 1 Kbyte).
  165. .PP
  166. The \fIreadBufSize\fP and \fIreadBuf\fP parameters indicate the size
  167. and location of an optional read buffer.
  168. No buffering is indicated by a zero read buffer size.
  169. See the library \fBPdev\fP and device \fPpdev\fP man pages for more details
  170. on using a read buffer.
  171. .SH Pfs_PassFile
  172. .PP
  173. \fBPfs_PassFile\fP is used to pass the open file descriptor of
  174. a regular file back to a client in response to an open request.
  175. If this is done then the pseudo-file-system server sees no further
  176. requests concerning this open file;  the file is handled in
  177. the regular way the by kernel.
  178. .PP
  179. \fBPfs_PassFile\fP exists, but the kernel doesn't support it, yet.
  180. .SH Pfs_Close
  181. .PP
  182. \fBPfs_Close\fP is used to end pseudo-file-system service.
  183. This closes the naming stream to the kernel and frees up any
  184. dynamically allocated storage.  After this call \fIpfsToken\fP
  185. should not be used.
  186. .PP
  187. \fBPfs_PassFile\fP exists, but the kernel doesn't support it, yet.
  188. .SH NAME SERVICE PROCEDURES
  189. .ta 2.0i
  190. .pp
  191. The callbacks are given to \fBPfs_Open\fP as a record
  192. of procedures:
  193. .DS
  194. typedef struct {
  195.     int (*open)();    /* PFS_OPEN */
  196.     int (*getAttr)();    /* PFS_GET_ATTR */
  197.     int (*setAttr)();    /* PFS_SET_ATTR */
  198.     int (*makeDevice)();    /* PFS_MAKE_DEVICE */
  199.     int (*makeDir)();    /* PFS_MAKE_DIR */
  200.     int (*remove)();    /* PFS_REMOVE */
  201.     int (*removeDir)();    /* PFS_REMOVE_DIR */
  202.     int (*rename)();    /* PFS_RENAME */
  203.     int (*hardLink)();    /* PFS_HARD_LINK */
  204.     int (*symLink)();    /* PFS_SYM_LINK */
  205. } Pfs_CallBacks;
  206. .DE
  207. .PP
  208. Any of the elements can
  209. be NULL to indicate that the operation should be handled by
  210. a default handler that is a no-op procedure that returns
  211. a file-not-found error.
  212. The \fIservice\fP parameter to \fBPfs_Open\fP
  213. itself can also be NULL to indicate default
  214. handling for all operations.  This is only useful during initial test.
  215. The global variable \fBpfs_Trace\fP can be set to a non-zero value
  216. to generate printfs to stderr when
  217. each service procedure (default or user-supplied) is invoked.
  218. .PP
  219. All the name service procedures have
  220. a similar calling sequence that includes a relative pathname,
  221. a record containing input parameters,
  222. and a buffer for \fIpathname redirection\fP.
  223. (The \fBrename\fP and \fBhardlink\fP procedures have slighly different
  224. calling sequences because they handle two pathnames.)
  225. The pathname is relative to a prefix indicated
  226. by a \fIprefixID\fR in the input parameters.
  227. This ID is either for the root as defined by
  228. the \fIrootIDPtr\fP argument to \fBPfs_Open\fP,
  229. or for some directory who's ID was defined by \fBPfs_OpenConnection\fP
  230. when the directory was entered by a client process.
  231. .LP
  232. The service procedures should return 0 to mean success,
  233. otherwise they should return a suitable errno value.
  234. There are no other return results.  Open file connections are
  235. created as a side effect using \fBPfs_OpenConnection\fP.
  236. .LP
  237. It is possible that the pathname may leave the pseudo-file-system
  238. during any lookup operation.
  239. This happens with remote links, symbolic links back to the root,
  240. or with enough ``..'' components to take the pathname out the
  241. top of the pseudo-file-system.  In this case the pseudo-file-system
  242. server should return the remaining, or new, pathname instead of
  243. attempting to follow it itself.  The return code \fBEREMOTE\fR is
  244. used to indicate this situation, and the \fIredirectPtr\fP argument is
  245. used to return the new name:
  246. .DS
  247. typedef struct FsRedirectInfo {
  248.     int    prefixLength;
  249.     char fileName[FS_MAX_PATH_NAME_LENGTH];
  250. } FsRedirectInfo;
  251. .DE
  252. .PP
  253. If the lookup hits a symbolic link to the root the server should
  254. expand the link and return the new absolute pathname in this buffer.
  255. A remote link is like a symbolic link, except it indicates a nested
  256. prefix and its contents are the prefix itself.  Expanding it will
  257. result in a new absolute pathname.
  258. The length of the prefix that is embedded in the absolute path
  259. should be returned in the \fBprefixLength\fP
  260. field.  With regular symbolic links this field should be zero.
  261. If the server hits a ``..'' component that leaves its root it should
  262. place the remaining pathname, including the offending ``..'' component,
  263. into the buffer.  The prefix length is again zero in this case.
  264. .SH open
  265. .ta 2.5i
  266. .DS
  267. int
  268. (*service->open)(clientData, name, openArgsPtr, redirectPtr)
  269.     ClientData clientData;    /* Passed into Pfs_Open */
  270.     char *name;    /* Relative pathname */
  271.     Fs_OpenArgs *openArgsPtr;    /* Identifies prefix and caller */
  272.     FsRedirectInfo *redirectPtr;    /* Return - new pathname and prefix info if
  273.     * name leaves the pseudo-file-system */
  274. .DE
  275. .LP
  276. The open service procedure is invoked in response to an \fBopen\fR system call
  277. by a client process.  The \fIclientData\fP argument is the
  278. value passed into \fBPfs_Open\fR and is generally used to get back to
  279. the state kept for the pseudo-file-system.
  280. The \fIname\fP is a relative pathname that begins at the prefix
  281. indicated by \fI*openArgsPtr\fP.  The \fBFsOpenArgs\fP structure
  282. identifies the root of the pseudo-file-system, the
  283. prefix or starting directory of the pathname,
  284. and the identity of the calling process:
  285. .DS
  286. typedef struct {
  287.     Fs_FileID prefixID;    /* File ID from prefix handle */
  288.     Fs_FileID rootID;    /* File ID of root. */
  289.     int useFlags;    /* Flags defined in fs.h */
  290.     int permissions;    /* Permission bits for created files.  Already
  291.      * reflects per-process permission mask */
  292.     int type;    /* Used to contrain open to a specific type */
  293.     int clientID;    /* Host ID of client doing the open */
  294.     Fs_UserIDs id;    /* User and group IDs */
  295. } FsOpenArgs;
  296. .DE
  297. .LP
  298. The \fBprefixID\fR is either the fileID of the root of the pseudo-file-system,
  299. or the fileID of some directory in the pseudo-file-system that
  300. has been previously opened.
  301. The \fBuseFlags\fP is an or'd combination of flags defined in
  302. <fs.h> that include \fBFS_READ\fR, \fBFS_WRITE\fR, and \fBFS_EXECUTE\fR.
  303. The \fBpermissions\fR define the file mode when creating a file.
  304. File creation is indicated by the \fBFS_CREATE\fR usage flag.
  305. .PP
  306. The \fBtype\fR is used to constrain the open to a particular kind of file.
  307. Possible values are \fBFS_FILE\fR, which means any type will do,
  308. \fBFS_DIRECTORY\fR when changing the current directory,
  309. and \fBFS_SYMBOLIC_LINK\fR when reading links.
  310. .PP
  311. IMPORTANT:  \fBPfs_OpenConnection\fR and
  312. \fBPfs_PassFile\fR can only be called during the servicing of
  313. an open request.  If they are called (successfully) by the open call-back
  314. it must return 0, never a non-zero error status.
  315. .SH getAttr
  316. .ta 2.5i
  317. .DS
  318. int
  319. (*service->getAttr)(clientData, name, openArgsPtr, attrPtr, redirectInfoPtr)
  320.     ClientData clientData;    /* Passed into Pfs_Open */
  321.     char *name;    /* Relative pathname */
  322.     FsOpenArgs *openArgsPtr;    /* Bundled arguments */
  323.     Fs_Attributes *attrPtr;    /* Return - attributes of the file */
  324.     FsRedirectInfo *redirectInfoPtr;    /* Used when name leaves our domain */
  325. .DE
  326. .PP
  327. This call-back is made to get the attributes of a file in the pseudo-file-system
  328. given its pathname.  The arguments are similar to those of the \fBopen\fR
  329. call-back.  The \fIattrPtr\fP argument is used to return the attributes.
  330. .SH setAttr
  331. .ta 0.5i 2.5i
  332. .DS
  333. int
  334. (*service->setAttr)(clientData, name, openArgsPtr, flags, attrPtr,
  335.     redirectInfoPtr)
  336.     ClientData clientData;    /* Passed into Pfs_Open */
  337.     char *name;    /* Relative pathname */
  338.     FsOpenArgs *openArgsPtr;    /* Bundled arguments */
  339.     int flags;    /* Specifies which attrs to set */
  340.     Fs_Attributes *attrPtr;    /* New attributes of the file */
  341.     FsRedirectInfo *redirectInfoPtr;    /* Used when name leaves our domain */
  342. .DE
  343. .PP
  344. This call-back is made to set certain attributes of a file in
  345. the pseudo-file-system
  346. given its pathname.  The arguments are similar to those of the \fBopen\fR
  347. call-back.  Additionally, the \fIflags\fP argument indicates which attributes
  348. are to be set, and the \fIattrPtr\fP argument specifies their new values.
  349. The \fIflags\fP are an or'd combination of
  350. \fBFS_SET_TIMES\fR, \fBFS_SET_MODE\fR, \fBFS_SET_OWNER\fR,
  351. \fBFS_SET_FILE_TYPE\fR, \fBFS_SET_DEVICE\fR.
  352. .SH makeDevice
  353. .ta 2.5i
  354. .DS
  355. int
  356. (*service->makeDevice)(clientData, name, makeDevArgsPtr, redirectInfoPtr)
  357.     ClientData clientData;    /* Passed into Pfs_Open */
  358.     char *name;    /* Relative pathname */
  359.     FsMakeDeviceArgs *makeDevArgsPtr;    /* Bundled arguments */
  360.     FsRedirectInfo *redirectInfoPtr;    /* Used when name leaves our domain */
  361. .DE
  362. .PP
  363. This call-back is made to create a special device file in the
  364. pseudo-file-system.  The \fBFsMakeDeviceArgs\fP are similar to the
  365. \fBFsOpenArgs\fP with some addition information about the device:
  366. .DS
  367. typedef struct {
  368.     Fs_FileID prefixID;    /* FileID of the prefix */
  369.     Fs_FileID rootID;    /* FileID of the root */
  370.     Fs_Device device;    /* Device attributes */
  371.     int permissions;    /* Permissions already reflect per-process mask */
  372.     Fs_UserIDs id;    /* Identifies calling process */
  373.     int clientID;    /* Identifies host of calling process */
  374. } FsMakeDeviceArgs;
  375. .DE
  376. .SH makeDir
  377. .ta 2.5i
  378. .DS
  379. int
  380. (*service->makeDir)(clientData, name, openArgsPtr, redirectInfoPtr)
  381.     ClientData clientData;    /* Passed into Pfs_Open */
  382.     char *name;    /* Relative pathname */
  383.     FsOpenArgs *openArgsPtr;    /* Bundled arguments */
  384.     FsRedirectInfo *redirectInfoPtr;    /* Used when name leaves our domain */
  385. .DE
  386. .PP
  387. This call-back is made to create a directory.  The arguments are similar
  388. to those of the \fBopen\fP call-back.
  389. .SH remove
  390. .ta 2.5i
  391. .DS
  392. int
  393. (*service->remove)(clientData, name, lookupArgsPtr, redirectInfoPtr)
  394.     ClientData clientData;    /* Passed into Pfs_Open */
  395.     char *name;    /* Relative pathname */
  396.     FsLookupArgs *lookupArgsPtr;    /* Bundled arguments */
  397.     FsRedirectInfo *redirectInfoPtr;    /* Used when name leaves our domain */
  398. .DE
  399. .PP
  400. This call-back is made to remove a file in the pseudo-file-system.
  401. \fBFsLookupArgs\fP are a simplified sub-set of \fBFsOpenArgs\fP:
  402. .DS
  403. typedef struct {
  404.     Fs_FileID prefixID;    /* FileID of the prefix */
  405.     Fs_FileID rootID;    /* FileID of the root */
  406.     int useFlags;    /* not used */
  407.     Fs_UserIDs id;    /* User and group IDs of calling process */
  408.     int clientID;    /* Host ID of calling process */
  409. } FsLookupArgs;
  410. .DE
  411. .SH removeDir
  412. .ta 2.5i
  413. .DS
  414. int
  415. (*service->removeDir)(clientData, name, lookupArgsPtr, redirectInfoPtr)
  416.     ClientData clientData;    /* Passed into Pfs_Open */
  417.     char *name;    /* Relative pathname */
  418.     FsLookupArgs *lookupArgsPtr;    /* Bundled arguments */
  419.     FsRedirectInfo *redirectInfoPtr;    /* Used when name leaves our domain */
  420. .DE
  421. .PP
  422. This call-back is made to remove a directory in the pseudo-file-system.
  423. The server should check against removing non-empty directories.
  424. The arguments are the same as for \fBremove\fP.
  425. .SH rename
  426. .ta .5i 3.0i
  427. .DS
  428. int
  429. (*service->rename)(clientData, srcName, dstName, twoNameArgsPtr,
  430.     redirect2InfoPtr)
  431.     ClientData clientData;    /* Passed into Pfs_Open */
  432.     char *srcName;    /* Original name */
  433.     char *dstName;    /* New name */
  434.     Fs2PathParams *twoNameArgsPtr;    /* Lookup args plus prefixID2 */
  435.     Fs2PathRedirectInfo *redirect2InfoPtr;    /* Used when name leaves our domain */
  436. .DE
  437. .PP
  438. This call-back is made to change the name of a file in the pseudo-file-system.
  439. The arguments are bundled into the \fBFs2PathParams\fP structure:
  440. .DS
  441. typedef struct Fs2PathParams {
  442.     FsLookupArgs lookup;    /* Regular lookup parameters */
  443.     Fs_FileID prefixID2;    /* Prefix of second pathname */
  444. } Fs2PathParams;
  445. .DE
  446. .PP
  447. It is possible that the second pathname is not a part of the pseudo-file-system.
  448. The Sprite kernel still calls out to the pseudo-file-system in this case
  449. because the first pathname might be redirected out of the pseudo-file-system.
  450. If the second prefixID does not belong to the pseudo-file-system
  451. that is indicated by a \fBtype\fP value of -1.
  452. If the first pathname remains in the pseudo-file-system but the second
  453. prefixID is not in the pseudo-file-system
  454. then the error \fBEXDEV\fR should be returned.
  455. If either of the pathnames gets redirected, or an error occurs
  456. during pathname interpretation, the \fBFs2PathRedirectInfo\fP
  457. structure is used to return more information:
  458. .DS
  459. .ta 0.5i 2.0i
  460. typedef struct {
  461.     int name1ErrorP;    /* TRUE if redirection or other error applies
  462.          * to the first pathname, FALSE if the error
  463.          * applies to second pathname, or no error */
  464.     int prefixLength;    /* The length of the prefix embedded in
  465.          * fileName.  This is used when a server hits
  466.          * a remote link and has to return a new file
  467.          * name plus an indication of a new prefix. */
  468.     char fileName[FS_MAX_PATH_NAME_LENGTH];
  469.         /* The new file name.  Returned
  470.          * from the server when its lookup is about
  471.          * to leave its domain. */
  472. } Fs2PathRedirectInfo;
  473. .DE
  474. .SH hardLink
  475. .ta .5i 3.0i
  476. .DS
  477. int
  478. (*service->hardLink)(clientData, srcName, dstName, twoNameArgsPtr,
  479.     redirect2InfoPtr)
  480.     ClientData clientData;    /* Passed into Pfs_Open */
  481.     char *srcName;    /* Original name */
  482.     char *dstName;    /* New name */
  483.     Fs2PathParams *twoNameArgsPtr;    /* Lookup args plus prefixID2 */
  484.     Fs2PathRedirectInfo *redirect2InfoPtr;    /* Used when name leaves our domain */
  485. .DE
  486. .PP
  487. This call-back is used to create a hard link between two files in the
  488. pseudo-file-system.  The arguments are the same as those for \fBrename\fP,
  489. and the same comments about pathname redirection apply.
  490. .SH symLink
  491. .DS
  492. int
  493. (*service->symLink)(clientData, linkName, value, openArgsPtr, redirectInfoPtr)
  494.     ClientData clientData;    /* returned from Pfs_Open */
  495.     char *linkName;    /* SymLink file name */
  496.     char *value;    /* Symlink value */
  497.     FsOpenArgs *openArgsPtr;    /* Open arguments */
  498.     FsRedirectInfo *redirectInfoPtr;    /* Used when srcName leaves our domain */
  499. .DE
  500. .PP
  501. This call-back is used to create a symbolic link in the
  502. pseudo-file-system.  The arguments are similar to those for \fBopen\fP,
  503. except there are two pathnames.
  504. Pathname redirection is only possible on the \fIlinkName\fR.
  505. The \fIvalue\fR pathname is simply used as the value of the link regardless
  506. of its location in the system.
  507. (This is not currently used.  Symbolic links are created instead by
  508. opening a file of type FS_SYMBOLIC_LINK and writing the link value
  509. into it.  This will change, although it currently works in NFS.)
  510. .PP
  511. The \fBtype\fP field in the open args is used differentiate between
  512. a regular symbolic link and a remote link.  A remote link is a circular
  513. symbolic link with a different file descriptor type than a symbolic
  514. link.  Remote links are used in native Sprite file systems to indicate
  515. a nested prefix that is stored elsewhere.  Bumping into a remote link
  516. causes a pathname redirection just like hitting a symbolic link back
  517. to the root.  Additionally, however, the redirection information also
  518. includes the length of the prefix that is embedded into the returned
  519. pathname.
  520. .SH SEE ALSO
  521. pfs (devices), Pdev, Swap_Buffer
  522. .SH KEYWORDS
  523. pseudo-file-system
  524. @
  525.